במדריך זה נלמד כיצד לבצע ניתוב לכתובת ולהוסיף פילטרים לאותו נתיב
בעבר היה מישהו שניסה לעשות סדרת מדריכים לפריימוורק אך מסיבה כל שהיא הפסיק,החלטתי לכתוב על הנושא על מנת להציג לאנשים שעדיין לא מכירים את הפריימוורק קצת מהאפשרויות שהיא כוללת ואת הפשטות שהיא מאפשרת לעשות אותן.
אני לא יכול להבטיח שאני ימשיך לכתוב אך כל עוד יהיה לי זמן אני ינסה להוסיף עוד מדריכים.
טוב אז נתחיל,מערכת הניתוב נמצאת בקובץ app/routes.php ומחולקת לסוגי מתודות,כמו שאנחנו מכירים מהטפסים ב HTML -
<form action="myform" method="post">
</form>
</form>
במקרה הזה המתודה היא POST אך יש עוד מספר מקרים -
any - מתייחס לכל סוגי המתודות
match - מקבל מערך של מתודות אפשריות.
get - מתייחס רק לבקשות GET
post - מתייחס רק לבקשות POST
put - מתייחס רק לבקשות PUT
delete - מתייחס רק לבקשות DELETE
יכול להיות ששכחתי כמה,אך אלה העיקריות.
לדוגמא הקוד הנ"ל -
Route::get('my_route', 'MyRouteController@show');
הקוד מפנה לקונטולר MyRoute למתודה show אך הוא יתייחס רק לבקשות get שהכתובת היא "my_route" ,במידה וננסה לבצע POST לכתובת הוא לא יתייחס אליה.[ובמידה ולא אפשרנו מקרה של POST הוא יחזיר שהעמוד לא נמצא]
אוקי למדנו איך ליצור ניתוב בסיסי,אך מה קורה כאשר אנחנו רוצים להוסיף גם פרמטרים לכתובת כמו ה id של כתבה ?
Route::get('article/{id}', 'ArticleController@show');
במקרה הזה נפנה ל ArticleController@show רק כאשר id הוא מספר כלומר אם ננסה לגשת ל
article/abc
הוא לא יתייחס לבקשה מאחר ולא מדובר במספר ויחזיר 404.
ב laravel קיימים עוד מספר תבניות כגון any שמאפשר את כל סוגי התווים.
אך מה קורה אם אנחנו רוצים ליצור תבנית משלנו ?
גם על המקרה הזה חשבו המתכנתים של laravel ונבצע את זה בצורה הזאת -
Route::get('article/{my_slug}','ArticleController@show')->where('my_slug', '[a-z0-9_-א-ת]+');
יאפשר את כל התווים בעברית+כל התווים באנגלית ,מספרים ,קו תחתון ומינוס [-]
במידה ונרצה ליצור את התבנית למספר כתובות ולאפשר גמישות בעתיד נשתמש במתודה הסטטית pattern על מנת ליצור את התבנית.
Route::pattern('my_slug', '[a-z0-9_-א-ת]+');
Route::get('article/{my_slug}', 'ArticleController@show');
Route::get('article/{my_slug}', 'ArticleController@show');
אחרי שלמדנו איך יוצרים תבניות מה קורה אם נרצה לבצע מספר בדיקות על חלק מהנתיבים האלה ? למשל לבדוק האם המשתמש מחובר?
בעבר היינו מוסיפים בדיקה כמו
if(isset($_SESSION['logged_in'])){
//is logged in code..
}
//is logged in code..
}
או משהו בסגנון לכל קובץ שאנחנו רוצים לבדוק.
ב laravel ניתן להוסיף פילטרים לנתיבים.
כל הפילטרים נמצאים תחת
app/filters.php
קיימים כמה פילטרים מובנים כמו auth שבודק האם המשתמש מחובר ו csrf שמוודא שהטופס נשלח מהאתר ולא באמצעות צד שלישי.
במידה ונרצה ליצור פילטר חדש בשם 'my_fiter' נבצע זאת כך -
Route::filter('my_filter',function(){
//filter code
});
//filter code
});
ועל מנת לגרום לנתיב להשתמש בפילטר נבצע זאת כך -
Route::get('article/{my_slug}', array('before' => 'my_filter'),'ArticleController@show');
במידה ונרצה יותר מפילטר אחד על אותו נתיב,נפריד אותם עם התו "|" כך -
Route::get('article/{my_slug}', array('before' => 'my_filter|another_filter'),'ArticleController@show');
אם יש לנו מספר נתיבים שמשתמשים באותם פילטרים ניתן לבצע זאת כך -
Route::group(array('before' => 'auth'), function()
{
Route::get('users_only', function()
{
// code goes here...
});
Route::get('users_only2', function()
{
// code goes here
});
});
{
Route::get('users_only', function()
{
// code goes here...
});
Route::get('users_only2', function()
{
// code goes here
});
});
ולהימנע מלרשום before על כל נתיב.
בנוסף ניתן להוסיף prefix לאותה קבוצה ולהימנע מלרשום את תחילת הנתיב ,לדוגמא במקרה בעמוד של מנהל במקום לכתוב כך -
Route::group(array('before' => 'admin_auth'), function()
{
Route::get('admin/admin_only', function()
{
// code goes here...
});
Route::get('admin/admin_only2', function()
{
// code goes here
});
});
{
Route::get('admin/admin_only', function()
{
// code goes here...
});
Route::get('admin/admin_only2', function()
{
// code goes here
});
});
ניתן לכתוב כך -
Route::group(array('prefix' => 'admin','before' => 'admin_auth'), function()
{
Route::get('admin_only', function()
{
// code goes here...
});
Route::get('admin_only2', function()
{
// code goes here
});
});
{
Route::get('admin_only', function()
{
// code goes here...
});
Route::get('admin_only2', function()
{
// code goes here
});
});
אוקי אני חושב שסיימנו,אם שכחתי חשוב [אני יודע שיש כמה חלקים שהשמטתי אבל אני חושב שהם קצת מיותרים לאנשים שרק מתחילים להתעסק עם הפריימוורק והעדפתי לא לציין] אשמח אם תציינו בתגובות.
במדריך הבא אני יסביר על איך ליצור קונטרולר על מנת באמת לממש את המערכת ניתוב.
תגובות לכתבה:
מדריך מעולה, מועיל מאוד!! ממליץ על laravel לכולם פשוט פריימוורק פנטסטי :)